<!DOCTYPE html>
<html lang="zh-cn">
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		 
			
  
    <meta name="twitter:card" content="summary"/>
    
      <meta name="twitter:image" content="https://www.samrainhan.com/images/avatar.png" />
    
  
  
  <meta name="twitter:title" content="GVim编辑窍门"/>
  <meta name="twitter:description" content="准备工作 首先， 我们打开 VIM， 输入一段文本， 用于今天的演示：this is a test 查找替换 按几下 ESC 进入 Normal 模式， 输入以下命令： :%s/ /\r/g 回车后得到的效果如下"/>
  
  
  
  
    <meta name="twitter:creator" content="@韩雨"/>
  



		
		<meta name="author" content="韩雨">
		<meta name="description" content="学习 &amp;nbsp;&amp;bull;&amp;nbsp; 生活">
		<meta name="generator" content="Hugo 0.52" />
		<title>GVim编辑窍门 &middot; sam的小窝</title>
		<link rel="shortcut icon" href="https://www.samrainhan.com/images/favicon.ico">
		<link rel="stylesheet" href="https://www.samrainhan.com/css/style.css">
		<link rel="stylesheet" href="https://www.samrainhan.com/css/highlight.css">

		
		<link rel="stylesheet" href="https://www.samrainhan.com/css/font-awesome.min.css">
		

		
		<link href="https://www.samrainhan.com/index.xml" rel="alternate" type="application/rss+xml" title="sam的小窝" />
		

		
	</head>

    <body>
       <nav class="main-nav">
	
	
		<a href='https://www.samrainhan.com/'> <span class="arrow">←</span>Home</a>
	
	<a href='https://www.samrainhan.com/posts'>Archive</a>
	<a href='https://www.samrainhan.com/tags'>Tags</a>
	<a href='https://www.samrainhan.com/about'>About</a>

	

	
	<a class="cta" href="https://www.samrainhan.com/index.xml">Subscribe</a>
	
</nav>


        <section id="wrapper" class="post">
            <article>
                <header>
                    <h1>
                        GVim编辑窍门
                    </h1>
                    <h2 class="headline">
                    Feb 11, 2010 00:00
                    · 2474 words
                    · 5 minute read
                      <span class="tags">
                      
                      
                          
                              <a href="https://www.samrainhan.com/tags/gvim">gvim</a>
                          
                              <a href="https://www.samrainhan.com/tags/vim">vim</a>
                          
                              <a href="https://www.samrainhan.com/tags/vi">vi</a>
                          
                              <a href="https://www.samrainhan.com/tags/tip">tip</a>
                          
                      
                      
                      </span>
                    </h2>
                </header>
                
                  
                    <div id="toc">
                      <nav id="TableOfContents">
<ul>
<li><a href="#准备工作">准备工作</a></li>
<li><a href="#查找替换">查找替换</a></li>
<li><a href="#行的拼接">行的拼接</a></li>
<li><a href="#复制粘贴与重复动作">复制粘贴与重复动作</a></li>
<li><a href="#列操作">列操作</a></li>
<li><a href="#宏的录制">宏的录制</a></li>
<li><a href="#点命令">点命令</a></li>
<li><a href="#跳转练习">跳转练习</a></li>
</ul>
</nav>
                    </div>
                  
                
                <section id="post-body">
                    

<h1 id="准备工作">准备工作</h1>

<p>首先， 我们打开 VIM， 输入一段文本， 用于今天的演示：this is a test</p>

<h1 id="查找替换">查找替换</h1>

<p>按几下 ESC 进入 Normal 模式， 输入以下命令： <code>:%s/ /\r/g</code> 回车后得到的效果如下：</p>

<pre><code>this
is
a
test
</code></pre>

<p>解说： 这条命令的作用是将文章中所有的空格替换为回车。 几乎所有的编辑器都支持查找替换， 但并不是所有的编辑器都支持把空格替换为回车， 因此这个功能在许多别的编辑器里做起来是比较繁琐的。</p>

<h1 id="行的拼接">行的拼接</h1>

<p>刚才我们把一行文字打碎为 4 行了， 那如何再把它们拼接起来呢？ 当然， 我们可以通过前面说的查找替换的方式， 将回车再替换为空格， 实现行的拼接。 但是， 这里我们用的是另一种方式。
按几下 ESC 进入 Normal 模式， 然后输入这段命令： <code>ggVG</code>. <code>gg</code> 表示跳到文本开头， <code>V</code> 表示进入行选择模式， <code>G</code> 表示选择到文章末尾。 通过这 3 条命令， 总共 4 个按键， 我们选中了整篇文章。
然后， 按下冒号 <code>:</code> 进入命令模式， 状态栏上出现： <code>:'&lt;,'&gt;</code>字样， 在它后面输入 <code>j</code>， 然后回车， 可以看到， 整篇文章又被拼接起来了， 整个操作包括回车只按了 7 次键：</p>

<pre><code>this is a test
</code></pre>

<h1 id="复制粘贴与重复动作">复制粘贴与重复动作</h1>

<p>按几下 ESC 确认当前处在 Normal 模式下， 然后按<code>yy</code>， 即可将当前行复制到默认寄存器中 (相当于剪贴板)。 然后按下<code>12p</code>， VIM 将执行粘贴动作 12 次， 屏幕上出现了 13 行这样的字符：</p>

<pre><code>this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
</code></pre>

<p>解说： 在 VIM 中， 复制和粘贴操作相当快捷。 另外， VIM 中大部分命令都可以通过在命令前加数字重复若干遍。</p>

<h1 id="列操作">列操作</h1>

<p>接下来我们把每一行的开头第一个字母改为大写。</p>

<p>按几下 ESC 确认当前处在 Normal 模式下， 然后按<code>gg</code>跳到第一行， 按下<code>Ctrl+v</code>进入列选择模式 (如果你按下<code>Ctrl+v</code>没能进入列选择模式， 请看这里)， 然后按<code>G</code>， 跳到文章最后一行，此时你应该看到，文本的第一列被选中了， 而且只选中了第一列。 按下<code>U</code>键， 可以看到， 每行的第一个字母都变为大写了。 提示： 选中文本后按<code>u</code>可以将文本变为小写， 选中文本后按<code>~</code>可以翻转原有的大小写。</p>

<pre><code>This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
</code></pre>

<p>然后， 我们在每行的前面加上一个星号。 按下<code>gg</code>跳到第一行， 按<code>Ctrl+v</code>进入列选择模式， 再按<code>G</code>， 选中全文的第一列， 然后按<code>I</code>， 进入列插入状态， 输入星号<code>*</code>， 再按下<code>ESC</code>， 你会看到， 所有行之前都出现了一个星号：</p>

<pre><code>*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
</code></pre>

<p>解说： 对于编写程序的人来说， 把一段代码批量注释掉是一个很常见的操作， 使用列插入可以很容易地做到这一点。 另外， 列选择后按<code>x</code>删除被选中的块， 可以批量地解除注释。</p>

<h1 id="宏的录制">宏的录制</h1>

<p>接下来， 我们要将文本的偶数行修改为： This is another test。 由于所有的偶数行都要进行同样的操作， 因此我们把这个操作录制下来， 然后重复播放若干遍， 就能很快地完成这项工作了。
首先， 按几下<code>ESC</code>确认处在 Normal 模式下， 再按下<code>gg</code>跳到第一行， 准备开始操作。 我们首先按下<code>q</code>键， 然后再按一个其它字母， 将这个宏录制到该字母对应的寄存器下。 例如我们这里使用m寄存器， 则按<code>qm</code>。 此时 VIM 状态栏出现<code>recording</code>字样， 表明已经进入了录制状态。
然后， 我们把第二行的<code>a</code>修改为<code>another</code>。 首先按<code>j</code>进入第二行， 然后按<code>$</code>跳到行末， 再按两下<code>b</code>往前跳两个单词， 此时光标停在字母<code>a</code>上。 然后我们按下<code>caw</code>键删除<code>a</code>并进入插入状态， 然后输入<code>another</code>， 按<code>ESC</code>回到 Normal 状态， 按<code>j</code>进入下一行， 整个操作步骤就完成了。 最后， 我们再按一下<code>q</code>， 结束该宏的录制。
接下来我们播放这个宏， 完成整个操作步骤。 在键盘上输入<code>1000@m</code>， 表示将m寄存器里的宏播放 1000 次， 马上可以看到， 文章中所有偶数行的a都变成了 another。</p>

<pre><code>*This is a test
*This is another test
*This is a test
*This is another test
*This is a test
*This is another test
*This is a test
*This is another test
*This is a test
*This is another test
*This is a test
*This is another test
*This is a test
</code></pre>

<p>解说： 虽然我们指定播放 1000 次， 但事实上， 执行到第 6 次的时候， 光标挪到了屏幕最下方， 于是执行过程就自动停止了。 因此， 在批量操作的时候， 我们可以指定足够大的数字， 而不用担心出现问题。
另外， 修改 a 的时候， 我们跳到行末后再使用 b 命令以单词为单位跳转， 而没使用 h 一个字母一个字母往回挪， 我们使用 caw 修改整个单词， 而不使用 s 命令删除单个字母并进入 Insert 模式。 这些细节可以保证录制得到的宏更具有一般性。</p>

<h1 id="点命令">点命令</h1>

<p>接下来， 我们在每行的末尾加上一个感叹号 !。
由于每行长度不同， 我们无法使用块选择方式批量尾部添加感叹号。 使用宏录制的方式是可以做到这点的， 但操作稍嫌繁琐了一些。 使用点命令， 可以非常方便地做到这一点。
先按几下<code>ESC</code>确认当前出于 Normal 模式， 然后使用<code>gg</code>跳到第一行， 按<code>A</code>进行行尾插入， 输入<code>!</code>， 然后按下<code>ESC</code>回到 Normal 状态， 第一行的感叹号就添加完毕了。
然后， 我们按<code>j</code>进入第二行， 再按<code>.，</code>可以看到， 第二行尾部也出现了感叹号。 反复按<code>j.j.j.</code>， 直到每一行尾部都添加了感叹行为止。</p>

<pre><code>*This is a test!
*This is another test!
*This is a test!
*This is another test!
*This is a test!
*This is another test!
*This is a test!
*This is another test!
*This is a test!
*This is another test!
*This is a test!
*This is another test!
*This is a test!
</code></pre>

<p>解说： 点命令的作用是， 重复最近一次所做的编辑操作。 由于在第一行里做的操作是行尾添加， 因此在第二行重复这个动作的时候， 也会在行尾添加同样的字符。 点命令功能不如宏强大， 但它使用起来比宏简便， 因此也有着广泛的用途。</p>

<h1 id="跳转练习">跳转练习</h1>

<p>在vim下可以使用常用的箭头键,但是 还有其它键可以让你更快的达到目标</p>

<pre><code>hjkl 这是代替箭头键功能的
H M L 跳到屏幕的顶上 中间 下方

w 跳到下一个单词的开始
e 跳到单词的结束
b 向后跳

gg 跳到文件的开始
G 跳到文件的结束
10gg 或10G 跳到第10行


ta 跳到下一个a 前面
fa 跳到下一个a
大写的意思相反
</code></pre>

<p>另外还有%(跳到文件的%多少) 和|(跳到第几列) 不过我很少用
上面的都可以加上数字前缀 表示第几个匹配</p>

<p>另外看文件时 除了pageup pagedown外还有其它的快速键
如<code>CTRL-F</code>向前一页 <code>CTRL-B</code> 向后一页</p>

<p>上面不是重要的
<code>CTRL-D</code> 向下半页 <code>CTRL-U</code> 向上半页我觉得更实用 这样看文章时就不会跳转出错
另外还有
<code>CTRL-E</code> 向下一行
<code>CTRL-Y</code> 向上一行</p>

<pre><code>^ 行首
$ 行尾
0 第一个字符
</code></pre>

<p>另外上面也作为vim其它命令的定位符 如删除<code>d</code>.</p>

<p><code>dt)</code>一直删除到这行的)</p>

                </section>
            </article>

            
                <a class="twitter" href="https://twitter.com/intent/tweet?text=https%3a%2f%2fwww.samrainhan.com%2fposts%2f2010-02-11-gvim-editing-tips%2f - GVim%e7%bc%96%e8%be%91%e7%aa%8d%e9%97%a8 "><span class="icon-twitter"> tweet</span></a>

<a class="facebook" href="#" onclick="
    window.open(
      'https://www.facebook.com/sharer/sharer.php?u='+encodeURIComponent(location.href),
      'facebook-share-dialog',
      'width=626,height=436');
    return false;"><span class="icon-facebook-rect"> Share</span>
</a>

            

            
                <div id="disqus_thread"></div>
<script type="text/javascript">
    var disqus_shortname = 'samrainblogbygithub'; 

     
    (function() {
        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
        dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    })();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
</div>

            

            
                <ul id="post-list" class="archive readmore">
    <h3>Read more</h3>

    
    
    
        <li>
            <a href="/posts/2019-04-26-c9-move-to-aws-c9/">Cloud9 Move to Aws C9<aside class="dates">Apr 26 2019</aside></a>
        </li>
    
        <li>
            <a href="/posts/2019-02-16-why-build-blog-with-cloud9/">2019 02 16 Why Build Blog With Cloud9<aside class="dates">Feb 16 2019</aside></a>
        </li>
    
        <li>
            <a href="/posts/2018-09-12-sports-stretching-best-practices/">运动拉伸最佳实践<aside class="dates">Sep 12 2018</aside></a>
        </li>
    
        <li>
            <a href="/posts/2018-09-12-add-2-files-to-tempdb-for-caching/">给tempdb加2个文件做缓存<aside class="dates">Sep 12 2018</aside></a>
        </li>
    
        <li>
            <a href="/posts/2018-09-12-look-for-sql-server-tables-without-a-clustered-index/">如何找到没有聚集索引的表<aside class="dates">Sep 12 2018</aside></a>
        </li>
    
        <li>
            <a href="/posts/2018-09-12-the-continuous-delivery-maturity-model/">持续实施成熟度模型<aside class="dates">Sep 12 2018</aside></a>
        </li>
    
        <li>
            <a href="/posts/2018-09-12-map-of-continuous-delivery/">持续发布的各个阶段<aside class="dates">Sep 12 2018</aside></a>
        </li>
    
        <li>
            <a href="/posts/2018-09-12-how-dropbox-securely-stores-your-passwords/">Dropbox的用户密码加密机制<aside class="dates">Sep 12 2018</aside></a>
        </li>
    
        <li>
            <a href="/posts/2018-09-12-code-inspection-tool-for-net/">NET代码检查工具<aside class="dates">Sep 12 2018</aside></a>
        </li>
    
        <li>
            <a href="/posts/2018-09-12-how-to-make-unique-id/">怎样生成唯一ID<aside class="dates">Sep 12 2018</aside></a>
        </li>
    
</ul>

            

            <footer id="footer">
    
        <div id="social">

	
	
    <a class="symbol" href="">
        <i class="fa fa-facebook-square"></i>
    </a>
    
    <a class="symbol" href="https://github.com/samrain">
        <i class="fa fa-github-square"></i>
    </a>
    
    <a class="symbol" href="">
        <i class="fa fa-twitter-square"></i>
    </a>
    


</div>

    
    <p class="small">
    
       © Copyright 2019 <i class="fa fa-heart" aria-hidden="true"></i> 韩雨
    
    </p>
    <p class="small">
        Powered by <a href="http://www.gohugo.io/">Hugo</a> Theme By <a href="https://github.com/nodejh/hugo-theme-cactus-plus">nodejh</a>
    </p>
</footer>

        </section>

        <script src="https://www.samrainhan.com/js/jquery-3.3.1.min.js"></script>
<script src="https://www.samrainhan.com/js/main.js"></script>
<script src="https://www.samrainhan.com/js/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>




  
<script type="application/javascript">
var doNotTrack = false;
if (!doNotTrack) {
	(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
	ga('create', 'UA-37708730-1', 'auto');
	
	ga('send', 'pageview');
}
</script>





    </body>
</html>
